from datetime import datetime

import requests
from flask import render_template, request
from run import app
from wxcloudrun.dao import delete_counterbyid, query_counterbyid, insert_counter, update_counterbyid
# from wxcloudrun.model import Counters
from wxcloudrun.response import make_succ_empty_response, make_succ_response, make_err_response
from wxcloudrun.wx import WechatMP
import cv2
import random
import numpy as np
a = WechatMP(Token='', appId='wx55aa181c413775b0', secret='5bb1c01a6e0f55d4023c55ddccaf56dd')
from wxcloudrun.mylogger import Mylogger
log = Mylogger()


@app.route('/')
def index():
    """
    :return: 返回index页面
    """
    return render_template('index.html')


@app.route('/api/count', methods=['POST'])
def count():
    """
    :return:计数结果/清除结果
    """

    # 获取请求体参数
    params = request.get_json()

    # 检查action参数
    if 'action' not in params:
        return make_err_response('缺少action参数')

    # 按照不同的action的值，进行不同的操作
    action = params['action']

    # 执行自增操作
    if action == 'inc':
        counter = query_counterbyid(1)
        if counter is None:
            # counter = Counters()
            counter.id = 1
            counter.count = 1
            counter.created_at = datetime.now()
            counter.updated_at = datetime.now()
            insert_counter(counter)
        else:
            counter.id = 1
            counter.count += 1
            counter.updated_at = datetime.now()
            update_counterbyid(counter)
        return make_succ_response(counter.count)

    # 执行清0操作
    elif action == 'clear':
        delete_counterbyid(1)
        return make_succ_empty_response()

    # action参数错误
    else:
        return make_err_response('action参数错误')


@app.route('/api/count', methods=['GET'])
def get_count():
    """
    :return: 计数的值
    """
    # counter = Counters.query.filter(Counters.id == 1).first()
    # return make_succ_response(0) if counter is None else make_succ_response(counter.count)


@app.route('/api/get', methods=['GET'])
def get_request():
    log.printLog('/api/get')
    return make_succ_response('GET request received')


@app.route('/api/post', methods=['POST'])
def post_request():
    json = request.json
    log.printLog('/api/post'+' Received POST request with data: {}'.format(json))
    sendToWxgzh(json)
    return make_succ_response( sendToWxgzh(json))

def upLoadImage(path):
    return a.uploadMedia("image", path )

# 上传图文
def sendToWxgzh(data):
    # 上传封面
    cover_image_info = a.uploadMedia("image", data.get("articles")[0].get("cover_image_path"))
    data.get("articles")[0]["thumb_media_id"] = cover_image_info.get("media_id")
    data.get("articles")[0]["cover_image_url"] = cover_image_info.get("url")
    data.get("articles")[0]["content"] = generate_article(data.get("articles")[0].get("images_path"))
    return a.uploadNews(data)

# 上传说图解画
def sendPictureArticle(data,content):
    # 上传封面
    cover_image_info = a.uploadMedia("image", data.get("articles")[0].get("cover_image_path"))
    data.get("articles")[0]["thumb_media_id"] = cover_image_info.get("media_id")
    data.get("articles")[0]["cover_image_url"] = cover_image_info.get("url")
    data.get("articles")[0]["content"] = generate_picture_article(data.get("articles")[0].get("images_path"),content)
    return a.uploadNews(data)


@app.route('/api/post/pic', methods=['POST'])
def post_pic():
    log.printLog('/api/post/pic' + 'Received POST request with data: {}'.format(json))
    return make_succ_response(a.uploadMedia(request.json.get("mediaType"), request.json.get("mediaPath")))


# 1. 获取随机名言警句
def get_random_quote():
    quotes = [
        "辛勤的蜜蜂永没有时间悲哀。——布莱克",
        "我这个人走得很慢，但是我从不后退。——亚伯拉罕·林肯",
        "一个人几乎可以在任何他怀有无限热忱的事情上成功。 ——查尔斯·史考伯",
        "深窥自己的心，而后发觉一切的奇迹在你自己。——培根",
        "失败也是我需要的，它和成功对我一样有价值。——爱迪生",
        "人需要真理，就像瞎子需要明快的引路人一样。——高尔基",
        "任何问题都有解决的办法，无法可想的事是没有的。——爱迪生",
        "每一种挫折或不利的突变，是带着同样或较大的有利的种子。——爱默生",
        "如果是玫瑰，它总会开花的。——歌德",
        "失败是坚忍的最后考验。——俾斯麦",
        "善于利用零星时间的人，才会做出更大的成绩来。——华罗庚",
        "少而好学，如日出之阳；壮而好学，如日中之光；老而好学，如炳烛之明。——刘向",
        "生活的情况越艰难，我越感到自己更坚强，甚而也更聪明。——高尔基",
        "如果我比笛卡尔看得远些，那是因为我站在巨人们的肩上的缘故。——牛顿",
        "一次失败，只是证明我们成功的决心还够坚强。——博 维",
        "对于不屈不挠的人来说，没有。——俾斯麦",
        "人生应该如蜡烛一样，从顶燃到底，一直都是光明的。 —— 萧楚女",
        "人生的价值，即以其人对于当代所做的工作为尺度。 —— 徐玮",
        "我们关心的，不是你是否失败了，而是你对失败能否无怨。——林肯",
        "人生不是一种享乐，而是一桩十分沉重的工作。——列夫·托尔斯泰",
        "但愿每次回忆，对生活都不感到负疚 —— 郭小川",
        "人的一生可能燃烧也可能腐朽，我不能腐朽，我愿意燃烧起来! —— 奥斯特洛夫斯基",
        "你若要喜爱你自己的价值，你就得给世界创造价值。 —— 歌德",
        "社会犹如一条船，每个人都要有掌舵的准备。 —— 易卜生",
        "人生不是一种享乐，而是一桩十分沉重的工作。 —— 列夫·托尔斯泰",
        "人生的价值，并不是用时间，而是用深度去衡量的。 —— 列夫·托尔斯泰",
        "人只有献身于社会，才能找出那短暂而有风险的生命的意义。 —— 爱因斯坦",
        "芸芸众生，孰不爱生?爱生之极，进而爱群。 —— 秋瑾",
        "生活真象这杯浓酒，不经三番五次的提炼呵，就不会这样可口! —— 郭小川",
        "充满着欢乐与斗争精神的人们，永远带着欢乐，欢迎雷霆与阳光。 —— 赫胥黎",
        "生命的意义在于付出，在于给予，而不是在于接受，也不是在于争取。——巴金",
        "时间是伟大的作者，她能写出未来的结局。——卓别林",
        "为了生活中努力发挥自己的作用，热爱人生吧。 —— 罗丹",
        "希望是附丽于存在的，有存在，便有希望，有希望，便是光明。 —— 鲁迅",
        "沉沉的黑夜都是白天的前奏。 —— 郭小川",
        "当一个人用工作去迎接光明，光明很快就会来照耀着他。 —— 冯学峰",
        "东天已经到来，春天还会远吗? —— 雪莱",
        "过去属于死神，未来属于你自己。 —— 雪莱",
        "世间的活动，缺点虽多，但仍是美好的。 —— 罗丹",
        "辛勤的蜜蜂永没有时间悲哀。 —— 布莱克",
        "希望是厄运的忠实的姐妹。 —— 普希金",
        "当你的希望一个个落空，你也要坚定，要沉着! —— 朗费罗",
        "先相信你自己，然后别人才会相信你。 —— 屠格涅夫",
        "宿命论是那些缺乏意志力的弱者的借口。 —— 罗曼·罗兰",
        "我们唯一不会改正的缺点是软弱。 —— 拉罗什福科",
        "私心胜者，可以灭公。 —— 林逋",
        "人人好公，则天下太平；人人营私，则天下大乱。 —— 刘鹗",
        "自私自利之心，是立人达人之障。 —— 吕坤",
        "如烟往事俱忘却，心底无私天地宽。 —— 陶铸",
        "常求有利别人，不求有利自己。 —— 谢觉哉",
        "一切利己的生活，都是非理性的，动物的生活。 —— 列夫·托尔斯泰",
        "人的理性粉碎了迷信，而人的感情也将摧毁利己主义。 —— 海涅",
        "无私是稀有的道德，因为从它身上是无利可图的。 —— 布莱希特",
        "生活只有在平淡无味的人看来才是空虚而平淡无味的。 —— 车尔尼雪夫斯基",
        "一个人的价值，应该看他贡献什么，而不应当看他取得什么。 —— 爱因斯坦",
        "知识是珍宝，但实践是得到它的钥匙。——托马斯·富勒",
        "自然赐给了我们知识的种子，而不是知识的本身。——寒涅卡",
        "坚强的信念能赢得强者的心，并使他们变得更坚强。 ——白哲特",
        "清贫，洁白朴素的生活，正是我们革命者能够战胜许多困难的地方! —— 方志敏",
        "不幸可能成为通向幸福的桥梁。——日本谚语",
        "苦难磨炼一些人，也毁灭另一些人。——富勒",
        "过去属于死神，未来属于你自己。——雪莱",
        "真正的人生，只有在经过艰难卓绝的斗争之后才能实现。——塞涅卡",
        "当一个人用工作去迎接光明，光明很快就会来照耀着他。——冯学峰",
        "幸运并非没有恐惧和烦恼；厄运也决非没有安慰和希望。——培根",
        "勿问成功的秘诀为何，且尽全力做你应该做的事吧。——美华纳",
        "多数人都拥有自己不了解的能力和机会，都有可能做到未曾梦想的事情。 ——戴尔·卡耐基",
        "那脑袋里的智慧，就像打火石里的火花一样，不去打它是不肯出来的。——莎士比亚",
        "坚强的信念能赢得强者的心，并使他们变得更坚强。 ——白哲特",
        "生活的全部意义在于无穷地探索尚未知道的东西，在于不断地增加更多的知识。——左拉",
        "壮心未与年俱老，死去犹能作鬼雄。 —— 陆游",
        "故立志者，为学之心也；为学者，立志之事也。 —— 王阳明",
        "贫不足羞，可羞是贫而无志。 —— 吕坤",
        "我们以人们的目的来判断人的活动。目的伟大，活动才可以说是伟大的。 —— 契诃夫",
        "毫无理想而又优柔寡断是一种可悲的心理。 —— 培根",
        "生活的理想，就是为了理想的生活。 —— 张闻天",
        "人，只要有一种信念，有所追求，什么艰苦都能忍受，什么环境也都能适应。 —— 丁玲",
        "理想的人物不仅要在物质需要的满足上，还要在精神旨趣的满足上得到表现。 —— 黑格尔",
        "生命多少用时间计算，生命的价值用贡献计算。——裴多菲",
        "时间，就象海棉里的水，只要愿挤，总还是有的。——鲁迅",
        "一个能思想的人，才真是一个力量无边的人。 —— 巴尔扎克",
        "天然的才能好象天然的植物，需要学问来修剪。——培 根",
        "人不光是靠他生来就拥有一切，而是靠他从学习中所得到的一切来造就自己。——歌 德",
        "聪明的人有长的耳朵和短的舌头。——弗莱格",
        "人的天才只是火花，要想使它成熊熊火焰，哪就只有学习!学习!——高尔基",
        "有教养的头脑的第一个标志就是善于提问。——普列汉诺夫",
        "我的努力求学没有得到别的好处，只不过是愈来愈发觉自己的无知。——笛卡儿",
        "学问是异常珍贵的东西，从任何源泉吸收都不可耻。——阿卜·日·法拉兹",
        "学习是劳动，是充满思想的劳动。——乌申斯基",
        "把学问过于用作装饰是虚假；完全依学问上的规则而断事是书生的怪癖。——培 根",
        "当你还不能对自己说今天学到了什么东西时，你就不要去睡觉。——利希顿堡",
        "游手好闲的学习并不比学习游手好闲好。——约·贝勒斯",
        "求学的三个条件是：多观察、多吃苦、多研究。——加菲劳",
        "学到很多东西的诀窍，就是一下子不要学很多。——洛 克",
        "没有人事先了解自己到底有多大的力量，直到他试过以后才知道。——歌德",
        "多则价谦，万物皆然，唯独知识例外。知识越丰富，则价值就越昂贵。——马 戈",
        "作为心智脂肪储备起来的知识并无用处，只有变成了心智肌肉才有用。——斯宾塞",
        "知识和世故不同，真有学问的人往往是很天真的。——罗曼·罗兰",
        "要成功不需要什么特别的才能，只要把你能做的小事做得好就行了。——维龙",
        "节约时间，也就是使一个人的有限的生命，更加有效，而也就等于延长了人的寿命。——鲁迅"
    ]
    return random.choice(quotes)

def generate_picture_article(image,content):
    html_p_pre = """<section style="text-align: center;line-height: 1.25;color: rgb(43, 43, 43);letter-spacing: 2px;background-image: linear-gradient(90deg, rgba(50, 0, 0, 0.04) 3%, rgba(0, 0, 0, 0) 3%), linear-gradient(360deg, rgba(50, 0, 0, 0.04) 3%, rgba(0, 0, 0, 0) 3%);background-size: 20px 20px;background-position: center center;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, &quot;PingFang SC&quot;, Cambria, Cochin, Georgia, Times, &quot;Times New Roman&quot;, serif;visibility: visible;"> <p style="margin-top: 24px;text-align: center;display: inline-block;">
				<strong style="color: rgb(53, 148, 247); visibility: visible;">「"""
    html_p_post = """」</strong></p></section>"""
    html_img_pre = """<figure style="text-align: center;line-height: 1.25;color: rgb(43, 43, 43);letter-spacing: 2px;background-image: linear-gradient(90deg, rgba(50, 0, 0, 0.04) 3%, rgba(0, 0, 0, 0) 3%), linear-gradient(360deg, rgba(50, 0, 0, 0.04) 3%, rgba(0, 0, 0, 0) 3%);background-size: 20px 20px;background-position: center center;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, &quot;PingFang SC&quot;, Cambria, Cochin, Georgia, Times, &quot;Times New Roman&quot;, serif;visibility: visible;"><img src=" """
    html_img_post = """ </figure>"""
    article_content = ""
    article_content += html_p_pre + f'{content}' + html_p_post
    # image_url = a.uploadMedia("image", image).get("url")
    minimum_color = data[1]
    max_colors = data[2]
    article_content += html_img_pre + data[0] + '" style="width: 65%; margin-top: 16px; border-radius: 8px; max-width: 100%; box-shadow:rgb' + str(color_to_rgb(minimum_color)) + ' 3.53553px 3.53553px 8px;" alt="相框中的图片">' + html_img_post
    # html静态文本
    return article_content

def generate_article(images):
    html_p_pre = """<section style="text-align: center;line-height: 1.25;color: rgb(43, 43, 43);letter-spacing: 2px;background-image: linear-gradient(90deg, rgba(50, 0, 0, 0.04) 3%, rgba(0, 0, 0, 0) 3%), linear-gradient(360deg, rgba(50, 0, 0, 0.04) 3%, rgba(0, 0, 0, 0) 3%);background-size: 20px 20px;background-position: center center;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, &quot;PingFang SC&quot;, Cambria, Cochin, Georgia, Times, &quot;Times New Roman&quot;, serif;visibility: visible;"> <p style="margin-top: 24px;text-align: center;display: inline-block;">
				<strong style="color: rgb(53, 148, 247); visibility: visible;">「"""
    html_p_post = """」</strong></p></section>"""
    html_img_pre = """<figure style="text-align: center;line-height: 1.25;color: rgb(43, 43, 43);letter-spacing: 2px;background-image: linear-gradient(90deg, rgba(50, 0, 0, 0.04) 3%, rgba(0, 0, 0, 0) 3%), linear-gradient(360deg, rgba(50, 0, 0, 0.04) 3%, rgba(0, 0, 0, 0) 3%);background-size: 20px 20px;background-position: center center;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, &quot;PingFang SC&quot;, Cambria, Cochin, Georgia, Times, &quot;Times New Roman&quot;, serif;visibility: visible;"><img src=" """
    html_img_post = """ </figure>"""
    quotes = [get_random_quote() for _ in range(len(images))]
    quote_index = 0
    article_content = ""
    for image in images:
        data = image.split('|')
        quote = quotes[quote_index]
        article_content += html_p_pre + f'{quote}' + html_p_post
        # image_url = a.uploadMedia("image", image).get("url")
        minimum_color = data[1]
        max_colors = data[2]
        article_content += html_img_pre + data[0] + '" style="width: 65%; transform: rotateY(180deg); margin-top: 16px; border-radius: 8px; max-width: 100%; box-shadow:rgb' + str(color_to_rgb(minimum_color)) + ' 3.53553px 3.53553px 8px;" alt="相框中的图片">' + html_img_post
        quote_index += 1
    # html静态文本
    return article_content


def lighten_color(color_code):
    # 从颜色代码中提取RGB值
    red = int(color_code[1:3], 16)
    green = int(color_code[3:5], 16)
    blue = int(color_code[5:7], 16)

    # 计算浅色RGB值
    light_red = min(int(red + (255 - red) * 0.2), 255)
    light_green = min(int(green + (255 - green) * 0.2), 255)
    light_blue = min(int(blue + (255 - blue) * 0.2), 255)

    # 将浅色RGB值转换为十六进制字符串
    light_color_code = f"#{light_red:02x}{light_green:02x}{light_blue:02x}"
    return light_color_code

# 颜色转三元组
def color_to_rgb(color):
    if color.startswith('#'):  # 处理十六进制颜色表示（如 #FF0000）
        color = color[1:]  # 去掉 # 号

        if len(color) == 3:  # 缩写形式（如 #F00）
            r, g, b = color[0], color[1], color[2]
            r = int(r + r, 16)
            g = int(g + g, 16)
            b = int(b + b, 16)
        elif len(color) == 6:  # 完整形式（如 #FF0000）
            r = int(color[:2], 16)
            g = int(color[2:4], 16)
            b = int(color[4:], 16)
        else:
            raise ValueError("Invalid color format")
    else:
        raise ValueError("Unsupported color format")

    return r, g, b


# 三元组（即包含红、绿和蓝颜色分量的值）转换为十六进制颜色代码
def rgb_to_hex(rgb):
    r, g, b = rgb
    hex_code = '#{:02x}{:02x}{:02x}'.format(r, g, b)
    return hex_code

# 三元组转颜色
def rgb_to_color(rgb):
    r, g, b = rgb
    color_code = "({}, {}, {})".format(r, g, b)
    return color_code

def get_hex_color(color):
    return '#{:02x}{:02x}{:02x}'.format(int(color[0]), int(color[1]), int(color[2]))


def get_color_histogram(image):
    height, width, _ = image.shape
    pixels = np.reshape(image, (height * width, 3))
    return pixels


def get_max_color_triplet(color_percentages):
    max_percentage = max(color_percentages.values())
    max_colors = [color for color, percentage in color_percentages.items() if percentage == max_percentage]
    return max_colors[0]


def calculate_color_percentages(image_path):
    if 'http://' in image_path or 'https://' in image_path:
        # 发送HTTP请求获取图像数据
        response = requests.get(url, stream=True).raw
        # 将图像数据转换为NumPy数组
        image_array = np.asarray(bytearray(response.read()), dtype=np.uint8)
        # 使用cv2.imdecode将图像数组解码为BGR格式图像
        image = cv2.imdecode(image_array, flags=cv2.IMREAD_COLOR)
    else:
        # Load image using OpenCV
        image = cv2.imread(image_path)
        # Convert BGR to RGB color space
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    color_histogram = get_color_histogram(image)
    total_pixels = len(color_histogram)
    unique_colors, color_counts = np.unique(color_histogram, axis=0, return_counts=True)

    color_percentages = {}
    for i in range(len(unique_colors)):
        color_hex = get_hex_color(unique_colors[i])
        color_percentage = (color_counts[i] / total_pixels) * 100
        color_percentages[color_hex] = color_percentage

    return color_percentages


def get_minimum_color(image_path):
    if 'http://' in image_path or 'https://' in image_path:
        # 发送HTTP请求获取图像数据
        response = requests.get(image_path, stream=True).raw
        # 将图像数据转换为NumPy数组
        image_array = np.asarray(bytearray(response.read()), dtype=np.uint8)
        # 使用cv2.imdecode将图像数组解码为BGR格式图像
        image = cv2.imdecode(image_array, flags=cv2.IMREAD_COLOR)
    else:
        # Load image using OpenCV
        image = cv2.imread(image_path)
        # Convert BGR to RGB color space
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    # Calculate the color distribution of the image
    hist = cv2.calcHist([image], [0, 1, 2], None, [8, 8, 8], [0, 256, 0, 256, 0, 256])
    # Normalize the histogram
    hist /= hist.sum()
    # Find the color with minimum occurrence
    min_color = (0, 0, 0)
    min_occurrence = 1.0
    for r in range(8):
        for g in range(8):
            for b in range(8):
                occurrence = hist[r, g, b]
                if occurrence > 0 and occurrence < min_occurrence:
                    min_occurrence = occurrence
                    min_color = (r * 32, g * 32, b * 32)
    return rgb_to_hex(min_color)
